import {IconifyInfo} from "@iconify/types"
import {FetchUtil} from '@xtail/req'

/**
 * 搜索 Iconify 图标时的请求参数类型
 */
export type SearchIconifyIconsOptionsType = {
  limit?: number
  start?: number
  prefixes?: string[]
  category?: string
}

/**
 * 搜索 Iconify 图标时返回的结果对象类型
 */
export type SearchIconifyIconsResult = {
  // 图标列表（包含前缀）
  icons: string[]
  // 总结果数（如果与 limit 值相同，表示还有更多结果）
  total: number
  // 当前返回结果数量
  limit: number
  // 起始结果索引
  start: number
  // 图标集信息（键为集合名称，值为图标集信息的对象）
  collections: Record<string, IconifyInfo>
  // 请求参数的副本（所有值均为字符串类型）
  request: Record<keyof SearchIconifyIconsOptionsType, string>
}

/**
 * 搜索 Iconify 图标
 * Iconify 文档：https://iconify.design/docs/api/search.html
 * 如果搜索字符串 query 中包含特殊关键字，请参考官方文档相关说明：https://iconify.design/docs/api/search.html#keywords
 *
 * @param {string} query 图标搜索字符串
 * @param {SearchIconifyIconsOptionsType} options 图标搜索配置选项：
 * - limit: 搜索结果数量限制，默认为 64，最小值为 32，最大值为 999
 * - start: 返回搜索结果的起始索引，默认为 0
 * - prefixes: 图标集前缀列表，用于将搜索结果限制在指定图标集中，默认为全部图标集
 * - category: 图标集的类别，用于将搜索结果限制在指定类别的图标集中，默认为全部类别
 * @returns {Promise<SearchIconifyIconsResult>} Iconify 图标搜索结果对象
 */
export const searchIcons = async (
  query: string,
  options: SearchIconifyIconsOptionsType = {}
): Promise<SearchIconifyIconsResult> => {
  const {limit, start, prefixes, category} = {
    limit: 64,
    start: 0,
    prefixes: [],
    category: '',
    ...options
  }
  let url = `https://api.iconify.design/search?query=${query}&limit=${limit}&start=${start}&pretty=1`
  if (prefixes.length > 0) url += `&prefixes=${prefixes.join(',')}`
  if (category) url += `&category=${category}`
  return await FetchUtil.req({url})
}

export type SearchIconifyIconsType = typeof searchIcons
